package cn.edu.njnu.opengmpback.collaboration.enums;

import lombok.Getter;

/**
 * 协作项目角色枚举
 * 基于原协作系统的四层角色体系设计
 * 
 * 权限层级：
 * - Leader层（项目管理者）：4级权限
 * - Technique层（技术核心层）：3级权限  
 * - Awareness层（参与层）：2级权限
 * - Public层（访问层）：1级权限
 */
@Getter
public enum ProjectRole {
    
    // Leader层（项目管理者）- 4级权限
    MANAGER("manager", "项目经理", 4, "负责项目整体管理和决策"),
    
    // Technique层（技术核心层）- 3级权限
    RESEARCHER("researcher", "研究员", 3, "负责项目研究工作"),
    EXPERT("expert", "专家", 3, "提供专业技术指导"),
    DECISION_MAKER("decision-maker", "决策者", 3, "参与重要决策制定"),
    CORE_MEMBER("core-member", "核心成员", 3, "项目核心参与者"),
    
    // Awareness层（参与层）- 2级权限
    STAKEHOLDER("stakeholder", "利益相关者", 2, "项目利益相关方"),
    CONSULTANT("consultant", "顾问", 2, "提供咨询建议"),
    ORDINARY_MEMBER("ordinary-member", "普通成员", 2, "一般项目参与者"),
    
    // Public层（访问层）- 1级权限
    VISITOR("visitor", "访客", 1, "项目访问者");
    
    /**
     * 角色代码（存储在数据库中的值）
     */
    private final String code;
    
    /**
     * 角色中文名称
     */
    private final String displayName;
    
    /**
     * 权限级别（数字越大权限越高）
     */
    private final int level;
    
    /**
     * 角色描述
     */
    private final String description;
    
    ProjectRole(String code, String displayName, int level, String description) {
        this.code = code;
        this.displayName = displayName;
        this.level = level;
        this.description = description;
    }
    
    /**
     * 根据代码获取角色枚举
     * 
     * @param code 角色代码
     * @return 对应的角色枚举，如果不存在则返回null
     */
    public static ProjectRole fromCode(String code) {
        if (code == null) {
            return null;
        }
        
        for (ProjectRole role : ProjectRole.values()) {
            if (role.getCode().equals(code)) {
                return role;
            }
        }
        return null;
    }
    
    /**
     * 检查当前角色是否有足够权限执行某个操作
     * 
     * @param requiredRole 需要的最低权限角色
     * @return true 如果有权限，false 如果没有权限
     */
    public boolean hasPermission(ProjectRole requiredRole) {
        return this.level >= requiredRole.level;
    }
    
    /**
     * 判断是否为管理层角色（Manager）
     * 
     * @return true 如果是管理角色
     */
    public boolean isManager() {
        return this == MANAGER;
    }
    
    /**
     * 判断是否为技术核心层角色
     * 
     * @return true 如果是技术层角色
     */
    public boolean isTechniqueLevel() {
        return this.level == 3;
    }
    
    /**
     * 判断是否为参与层角色
     * 
     * @return true 如果是参与层角色
     */
    public boolean isAwarenessLevel() {
        return this.level == 2;
    }
    
    /**
     * 判断是否为访客角色
     * 
     * @return true 如果是访客
     */
    public boolean isVisitor() {
        return this == VISITOR;
    }
}